package com.monster.common.http;

import com.monster.common.Constant;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * 统一返回对象包装
 *
 * @param <T>
 * @author kuang
 */
@Data
@Accessors(chain = true)
public class ResponseData<T> implements Serializable {
    private ResponseData() {
    }

    /**
     * 响应的code
     */
    private String code;
    /**
     * 传输数据
     */
    private T data;
    /**
     * 提示信息
     */
    private String info;
    /**
     * 时间戳
     */
    private Long time = System.currentTimeMillis();
    /**
     * 签名信息
     */
    private String sign;
    /**
     * 额外的其他扩展属性
     */
    private Map<String, Object> extend = new HashMap<>();

    /**
     * 自定义扩展属性put方法
     *
     * @param key   key
     * @param value value
     * @return this
     */
    public ResponseData put(String key, Object value) {
        extend.put(key, value);
        return this;
    }

    /**
     * 自定义属性的get属性
     *
     * @param key key
     * @return value
     */
    public Object get(String key) {
        return extend.get(key);
    }

    /**
     * 构造一个返回对象
     *
     * @return Result
     */
    public static ResponseData create() {
        return new ResponseData();
    }

    /**
     * 正确的构造方法
     *
     * @param data 数据
     * @return Result
     */
    public static ResponseData success(Object data) {
        return create().setCode(Constant.SUCCESS_CODE).setData(data).setInfo(Constant.SUCCESS_MSG);
    }

    /**
     * 正确的构造方法
     *
     * @param data 数据
     * @return Result
     */
    public static ResponseData success(Object data, String info) {
        return create().setCode(Constant.SUCCESS_CODE).setData(data).setInfo(info);
    }

    /**
     * 错误的构造方法
     *
     * @param code 错误编码
     * @param info 错误信息
     * @return Result
     */
    public static ResponseData error(String code, String info) {
        return create().setCode(code).setInfo(info);
    }
}
